/**
 * IP地址获取工具
 */

/**
 * 获取本地IP地址（局域网IP）
 * 使用WebRTC API获取本地网络接口的IP地址
 */
export function getLocalIP2() {
    return new Promise((resolve, reject) => {
      // 检查浏览器是否支持WebRTC
      if (!window.RTCPeerConnection) {
        reject(new Error('浏览器不支持WebRTC'));
        return;
      }
  
      const pc = new RTCPeerConnection({
        iceServers: [
          { urls: 'stun:stun.l.google.com:19302' },
          { urls: 'stun:stun1.l.google.com:19302' }
        ]
      });
  
      // 创建数据通道
      pc.createDataChannel('');
  
      // 创建offer
      pc.createOffer()
        .then(offer => pc.setLocalDescription(offer))
        .catch(reject);
  
      // 监听ICE候选
      pc.onicecandidate = (event) => {
        if (event && event.candidate && event.candidate.candidate) {
          const candidate = event.candidate.candidate;
          // 匹配IPv4地址
          const ipMatch = candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3})/);
          if (ipMatch && ipMatch[1]) {
            const ip = ipMatch[1];
            // 过滤掉一些无效的IP地址
            if (ip !== '0.0.0.0' && ip !== '127.0.0.1' && !ip.startsWith('169.254')) {
              pc.close();
              resolve(ip);
              return;
            }
          }
        }
      };
  
      // 设置超时
      setTimeout(() => {
        pc.close();
        reject(new Error('获取本地IP地址超时'));
      }, 5000);
    });
  }

  // 改进的本地IP获取方法
export function getLocalIP() {
    return new Promise((resolve, reject) => {
        // 创建RTCPeerConnection实例
        const pc = new RTCPeerConnection({
            iceServers: []
        });
        
        pc.createDataChannel('');
        pc.createOffer()
            .then(offer => pc.setLocalDescription(offer))
            .catch(reject);
            
        const ips = new Set(); // 使用Set避免重复
            
        pc.onicecandidate = (event) => {
            if (event.candidate) {
                const candidate = event.candidate.candidate;
                if (candidate) {
                    const ipMatch = candidate.match(/([0-9]{1,3}(\.[0-9]{1,3}){3})/);
                    if (ipMatch) {
                        const ip = ipMatch[1];
                        // 过滤有效IP
                        if (!ip.startsWith('127.') && 
                            !ip.startsWith('0.') && 
                            !ip.startsWith('169.254.')) {
                            ips.add(ip);
                        }
                    }
                }
            } else {
                // 候选收集完成
                if (ips.size > 0) {
                    resolve(Array.from(ips));
                } else {
                    reject(new Error('未找到有效本地IP'));
                }
            }
        };
    });
}
  
  /**
   * 获取公网IP地址
   * 通过第三方API服务获取
   */
  export async function getPublicIP() {
    const apis = [
      'https://api.ipify.org?format=json',
      'https://ipapi.co/json/',
      'https://api.myip.com',
      'https://ipinfo.io/json'
    ];
  
    for (const api of apis) {
      try {
        const response = await fetch(api, {
          method: 'GET',
          timeout: 5000
        });
        
        if (!response.ok) {
          continue;
        }
  
        const data = await response.json();
        console.log(data);
        // 不同API返回的数据结构可能不同
        if (data.ip) {
          return data.ip;
        } else if (data.query) {
          return data.query;
        } else if (data.ipAddress) {
          return data.ipAddress;
        }
      } catch (error) {
        console.warn(`API ${api} 请求失败:`, error);
        continue;
      }
    }
  
    throw new Error('无法获取公网IP地址');
  }
  
  /**
   * 获取所有可用的IP地址信息
   */
  export async function getAllIPInfo() {
    const result = {
      userAgent: navigator.userAgent,
      timestamp: Date.now()
    };
  
    try {
      result.localIP = await getLocalIP();
    } catch (error) {
      console.warn('获取本地IP失败:', error);
    }
  
    try {
      result.publicIP = await getPublicIP();
    } catch (error) {
      console.warn('获取公网IP失败:', error);
    }
   console.log(result,'llllllllllll');
    return result;
  }
  
  /**
   * 检查IP地址格式是否正确
   */
  export function isValidIP(ip) {
    const ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
    return ipRegex.test(ip);
  }
  
  /**
   * 获取IP地址类型（内网/外网）
   */
  export function getIPType(ip) {
    if (!isValidIP(ip)) {
      return 'invalid';
    }
  
    const parts = ip.split('.').map(Number);
    const [a, b, c] = parts;
  
    // 内网IP地址范围
    if (
      (a === 10) ||
      (a === 172 && b >= 16 && b <= 31) ||
      (a === 192 && b === 168) ||
      (a === 127) // 本地回环
    ) {
      return 'private';
    }
  
    return 'public';
  }